package com.bi.dto;

import com.bi.entity.WideTable;
import com.bi.entity.WideTableField;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * 创建数据宽表DTO
 * 
 * @author BI Platform Team
 * @since 1.0.0
 */
@Data
public class CreateWideTableDTO {

    /**
     * 宽表名称
     */
    @NotBlank(message = "宽表名称不能为空")
    @Size(max = 200, message = "宽表名称长度不能超过200个字符")
    private String name;

    /**
     * 显示名称
     */
    @NotBlank(message = "显示名称不能为空")
    @Size(max = 200, message = "显示名称长度不能超过200个字符")
    private String displayName;

    /**
     * 宽表描述
     */
    @Size(max = 1000, message = "宽表描述长度不能超过1000个字符")
    private String description;

    /**
     * 宽表类型
     */
    @NotNull(message = "宽表类型不能为空")
    private WideTable.WideTableType type;

    /**
     * 数据源配置
     */
    @Size(max = 500, message = "数据源配置长度不能超过500个字符")
    private String dataSource;

    /**
     * Elasticsearch索引名称
     */
    @Size(max = 100, message = "Elasticsearch索引名称长度不能超过100个字符")
    private String esIndexName;

    /**
     * 表配置信息
     */
    private Object tableConfig;

    /**
     * 宽表字段列表
     */
    @Valid
    @NotNull(message = "宽表字段列表不能为空")
    @Size(min = 1, message = "至少需要配置一个字段")
    private List<WideTableFieldDTO> fields;

    /**
     * 宽表字段DTO
     */
    @Data
    public static class WideTableFieldDTO {

        /**
         * 字段名称
         */
        @NotBlank(message = "字段名称不能为空")
        @Size(max = 100, message = "字段名称长度不能超过100个字符")
        private String fieldName;

        /**
         * 显示名称
         */
        @NotBlank(message = "字段显示名称不能为空")
        @Size(max = 100, message = "字段显示名称长度不能超过100个字符")
        private String displayName;

        /**
         * 字段类型
         */
        @NotNull(message = "字段类型不能为空")
        private WideTableField.FieldType fieldType;

        /**
         * 字段长度
         */
        private Integer fieldLength;

        /**
         * 精度(数值类型)
         */
        @Size(max = 20, message = "精度配置长度不能超过20个字符")
        private String precisionScale;

        /**
         * 是否允许为空
         */
        private Boolean nullable = true;

        /**
         * 默认值
         */
        @Size(max = 500, message = "默认值长度不能超过500个字符")
        private String defaultValue;

        /**
         * 字段描述
         */
        @Size(max = 500, message = "字段描述长度不能超过500个字符")
        private String description;

        /**
         * 是否为显示字段
         */
        private Boolean isDisplayField = true;

        /**
         * 是否为查询字段
         */
        private Boolean isQueryField = true;

        /**
         * 排序序号
         */
        private Integer sortOrder = 0;
    }
}